/********************************************************************************
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later 	*
* version. This program is distributed in the hope that it will be useful, but 	*
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more *
* details. You should have received a copy of the GNU General Public License 	*
* along with this program; if not, write to the Free Software Foundation, Inc., *
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.						*
* (c) Copyright 2012 José Delgado Pérez, josedelgado@ula.ve josed43@gmail.com.	*				*
********************************************************************************/

/**
 @file percepcion.h
 @brief Clase para el manejo de la funcionalidad del sistema de percepción de la plataforma LASDAI-LR2. Los atributos de esta clases
 	 	 son cada uno de los componentes que conforman SP de la plataforma. (Sensores US, sensores IR, Servo Motor).
 @date Diciembre, 2012.
 @author José Delgado Pérez, josedelgado@ula.ve josed43@gmail.com.
 @version 0.9
*/

#ifndef PERCEPCIONLR2_H
#define PERCEPCIONLR2_H

#include <Arduino.h>
#include "sensorIR.h"
#include "sensorUS.h"
//#include "servoMotor.h"
#include "definicion.h"
#include "Servo.h"

class percepcionLR2{

public:

	/** Constructor, inicializa cada uno de los componentes del sistema de percepción. */
	percepcionLR2();

	/** Inicializa cada uno de los componentes del sistema de percepción. */
	void inicializarSistemaPerecepcion(Servo * servo);

    /**
	 @brief Obtiene la medida de un sensor US en especifico.
	 @param idUS Identificador del sensor a consultar.
	 @return Valor de la medida del sensor.
	*/
	unsigned short int obtenerMedidaUS(int idUS);

    /**
	 @brief Obtiene la medida de un sensor IR en especifico.
	 @param idIR Identificador del sensor a consultar.
	 @return Valor de la medida del sensor.
	*/
	uint8_t obtenerMedidaIR(int idIR);

    /**
	 @brief Obtiene la medida del sensor US trasero de la plataforma con un ángulo especifico.
	 @param angulo Ángulo de pocisión del sensor US en la que se desea obtener la medida.
	 @return Valor de la medida del sensor.
	*/
	unsigned short int obtenerMedidaUSTrasero(int angulo);

    /**
	 @brief Obtiene la medida de cada uno de los sensores US ubicados en la parte delantera de la plataforma.
	 @return Retorna un vector que contiene la medida de cada uno de los 6 sensores en orden 1-6 ---> 0-5.
	*/
	unsigned short int* obtenerBarridoFrontalUS();

    /**
	 @brief Obtiene la medida de cada uno de los sensores IR ubicados en la parte delantera de la plataforma.
	 @return Retorna un vector que contiene la medida de cada uno de los 6 sensores en orden 1-6 ---> 0-5.
	*/
	uint8_t* obtenerBarridoFrontalIR();

    /**
	 @brief Obtiene la medida del sensor trasero en 5 posiciones distintas 50°, 70°, 90°, 110°, 130°.
	 @return Retorna un vector que contiene la medida en cada una de las 5 posiciones en orden 50°-130° ---> 0-4.
	*/
	unsigned short int* obtenerBarridoTraseroUS();

	/** Destructor */
	~percepcionLR2();

private:
	/** Anillo de 9 sensores US */
	sensorUS sensoresUS[9];

	/** Anillo de 6 sensores IR */
	sensorIR sensoresIR[6];

	/** Servomotor de acoplado al US de la parte trasera de la plataforma. */
	Servo * servoUS;

	/**
	 @brief Método privado que implementa un filtro a la medición de los sensores US para eliminar los picos de la entrada analógica.
	 @param idUS Identificador del sensor al que se le aplicara el filtro.
	 @return El valor de la medida después de pasar por el filtro.
	*/
	unsigned short int filtroUS(int idUS);

	/**
	 @brief Método privado que implementa un filtro a la medición de los sensores IR para eliminar los picos de la entrada analógica.
	 @param idIR Identificador del sensor al que se le aplicara el filtro.
	 @return El valor de la medida después de pasar por el filtro.
	*/
	uint8_t filtroIR(int idIR);

};

#endif
